# -*- coding: utf-8 -*-

import re

"""
Tekstinmuokkausfunktioita.
"""

class Wikitmpl(object):
    """
    Wikimallinetta esittävä olio.
    """

    def __init__(self, tmplkutsu):
        """
        @p tmplkutsu (unicode) esim. "{{fi-subs|aa|si|5}}"
        """
        self.prefiksi = None   # esim. #invoke
        self.malline = None    # esim. fi-subs
        self.parametrit = None # esim. [aa, si, 5]

        a = Wikitmpl.rajayta_malline(tmplkutsu)
        if a != []:
            b = a[0].split(":")
            if len(b) > 1:
                a[0] = b[1]
                self.prefiksi = b[0]
                self.parametrit = a
            else:
                a.reverse()
                self.malline = a.pop()
                a.reverse()
                self.parametrit = a

    def __unicode__(self):
        pref_mb = self.prefiksi and (self.prefiksi + u":") or u""
        return u"{{" + pref_mb + self.malline + u"|" + u"|".join(self.parametrit) + u"}}"

    def nimettomat(self):
        """
        Palauttaa mallineen nimettömät parametrit.
        """
        return filter(lambda b: b.find("=") == -1, self.parametrit)

    def set_nimettomat(self, lst):
        """
        Korvaa nimettömät parametrit listalla `lst`.
        """
        nimetyt = self.nimetyt()
        self.parametrit = lst + nimetyt

    def nimetyt(self):
        return filter(lambda b: b.find("=") != -1, self.parametrit)

    def set_nimetty(self, key, val):
        raise NotImplementedError
            
    def get_nimetty(self, key):
        a = [x for x in self.parametrit if x.beginsWith(key + "=")]
        if len(a) > 0:
            return a[0]
        return None

    def get_tekstiparams(self):
        nimettomat = self.nimettomat()
        nimetyt = self.nimetyt()
        d = dict((str(i+1), nimettomat[i]) for i in xrange(len(nimettomat)))
        for l in nimetyt:
            i = l.index(u'=')
            k = l[:i]
            v = l[i+1:]
            d[k] = v
        return d

    @staticmethod
    def rajayta_malline(tmplkutsu):
        """
        Pilkkoo mallinekutsun osiin, esim. {{fi-subs|pa|atti|5|C}} -> [fi-subs, pa, atti, 5, C],
        {{yhteys|fi|kanaruoat|k=en}} -> [yhteys, fi, kanaruoat, k=en], {{#invoke:Dum|kana}}} -> [#invoke:Dum, kana]
        
        @p (unicode)
        @return ([unicode] tai None)
        """
#        print u"räjytä: " + tmplkutsu
        m = re.match("^{{([^}]+)}}$", tmplkutsu)
        if m:
            return m.group(1).split("|")
        return []


def pilko(teksti, eka, toka):
    """
    Pilkkoo tekstin kolmeen osaan leukkauskohdista `eka` ja `toka`. Esim. f(ananas, 2, 4) -> (an, an, as).

    @p teksti (unicode)
    @p eka    (int)
    @p toka   (int)
    @return   (3-tuple (unicode*3))
    """
    a = teksti[:eka]
    b = teksti[eka:toka]
    c = teksti[toka:]
    return (a, b, c)



def insert(teksti, lisa, kohta, pit=0):
    """
    Lisää tekstin `lisa` `tekstin` kohtaan `kohta`, jos `pit` on annettu korvaa `pit` merkkiä.

    @p teksti (unicode) 
    @p lisa   (unicode)  lisättävä
    @p kohta  (int)      
    @p pit    (int)      
    @return   (unicode)
    """
    return teksti[:kohta] + lisa + teksti[kohta+pit:]



def poista_osiosta(teksti, sana):
    """
    Poistaa annetun 'sanan' osion 'tekstin' luetteloista.
    """
    teksti += "\n"
    # rivinkeskinen tai viimeinen linkki
    teksti = re.sub(r"\s*,[ \t]*\n?\[\[" + sana + r"\]\]", "", teksti)
    # rivinalkuinen 
    teksti = re.sub(r"\[\[" + sana + r"\]\][ \t]*,[ \t]*\n?", "", teksti)
    # yksittäinen linkki rivillä, esim.:  * [[kala]]
    teksti = re.sub(r"[*:#]*\s*\[\[" + sana + r"\]\][ \t]*\n", "", teksti)

    return teksti

def poista_osiosta_arr(teksti, sanat):
    for sana in sanat:
        teksti = poista_osiosta(teksti, sana)
    return teksti



def poista_osiosta_custom(teksti, sana, rivin_alku):
    """
    Poistaa annetun 'sanan' osion 'tekstin' luetteloista.
    """
    teksti += "\n"
    # rivinkeskinen tai viimeinen linkki
    teksti = re.sub(r"\s*,[ \t]*\n?\[\[" + sana + r"\]\]", "", teksti)
    # rivinalkuinen 
    teksti = re.sub(r"\[\[" + sana + r"\]\][ \t]*,[ \t]*\n?", "", teksti)
    # yksittäinen linkki rivillä, esim.: *verbit: [[kalastaa]]
    teksti = re.sub(rivin_alku + r"\s*\[\[" + sana + r"\]\][ \t]*\n", "", teksti)

    return teksti
